/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package negocio;

import datos.Obra;
import java.net.URL;
import java.util.Date;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

/**
 *
 * @author Ing. Monica Merlo, Ing. Agustin  Fernandez
 */
@Stateless
public class GestorConsultaObraBean implements GestorConsultaObraRemote, GestorConsultaObraLocal {

     /***
     *  Los objetos que invoca una aplicación para generar log se denominan \\\"loggers\\\" y son de la clase Logger.
     *  Una estrategia común y conveniente es que cada una de nuestras clases (al menos las que van a emitir log)
     *  tengan un objeto estático.
     *  Los niveles son los siguientes: debug, info, warn, error, fatal.
     */
    static Logger logger = Logger.getLogger(GestorConsultaObraBean.class);

    private static void log4jArchivo(Exception e) {

         /**
         * Primero obtenemos la url del archivo de configuración,
         * como están en el mismo paquete que la clase Main lo podemos obtener con el método getResource().
         */
        URL url = GestorConsultaObraBean.class.getResource("/configuracion/log4j.properties");
        /**
         * Despues cargamos el archivo de configuración
         */
        PropertyConfigurator.configure(url);
        logger.error(e);

    }
    
    @PersistenceContext
    private  EntityManager em;

    /***
     * 
     * @param object
     */
    public void persist (Object object)
    {
        em.persist(object);
    }


    /***
     * Retorna una lista con todas las instancias de Obra
     * @return una lista de todas las obras almacenadas en la Base de Datos
     * Interfaz remota
     */
    public List consultarObraRemote() {
        try {
            javax.persistence.Query q = em.createNamedQuery("Obra.findAll");
            return q.getResultList();

        } catch (Exception e) {
            GestorConsultaObraBean.log4jArchivo(e);
            return null;
        }
    }

    /***
     * Retorna una lista con todas las instancias de Obra
     * @return una lista de todas las obras almacenadas en la Base de Datos
     * Interfaz local
     */
    public List consultarObra() {
         try {
            javax.persistence.Query q = em.createNamedQuery("Obra.findAll");
            return q.getResultList();

        } catch (Exception e) {
            GestorConsultaObraBean.log4jArchivo(e);
            return null;
        }
    }

    /***
     * Retorna una lista con todas aquellas instancias de Obras que coincidan con los criterios de búsqueda
     * definidos por el usuario en la UI.
     * @param fechaInicio
     * @param fechaFin
     * @param departamento
     * @param empresa
     * @param programa
     * @param monto
     * @param obra
     * @param tipoObra
     * @param subtipoObra
     * @return una lista con todas aquellas obras que coincidan con los criterios de búsqueda definidos por el usuario en la UI,
     * y Null en caso contrario
     * Interfaz local
     */
    public List<Obra> filtrarObrasPublicas(Date fechaInicio, Date fechaFin, String departamento, String empresa, String programa, Float monto, String obra, String tipoObra, String subtipoObra) {
       try {
            String sql = "SELECT o FROM Obra o WHERE o.nombre LIKE :nombreObra " +
                    "AND o.idTipoObra.nombre LIKE :tipoObra " +
                    "AND o.idSubtipoObra.nombre LIKE :subtipoObra " +
                    "AND o.idEmpresa.razonSocial LIKE :razonSocial " +
                    "AND o.idPrograma.nombre LIKE :programa";

            if (fechaInicio != null) {
                    sql = sql + " AND o.fechaInicioReal >= :fechaInicio";
            }

            if (fechaFin != null) {
                    sql = sql + " AND o.fechaFinReal <= :fechaFin";
            }

            if (departamento != null) {
                //No se busca
            }

            if (monto != null) {
                    sql = sql + " AND o.montoTotal >= :monto";
            }

            sql = sql + " AND o.eliminada = 0 ORDER BY o.nombre";
            javax.persistence.Query q = em.createQuery(sql);
            q.setParameter("nombreObra", "%" + obra + "%");
            q.setParameter("tipoObra", "%" + tipoObra + "%");
            q.setParameter("subtipoObra", "%" + subtipoObra + "%");
            q.setParameter("razonSocial", "%" + empresa + "%");
            q.setParameter("programa", "%" + programa + "%");
            if(fechaInicio!=null){
                q.setParameter("fechaInicio", fechaInicio);
            }
            if(fechaFin!=null){
                q.setParameter("fechaFin", fechaFin);
            }
            if(monto!=null){
                q.setParameter("monto", monto.floatValue());
            }
            return (List<Obra>) q.getResultList();
        } catch (Exception e) {
            GestorConsultaObraBean.log4jArchivo(e);
            return null;
        }
    }

    /***
     * Retorna una lista con todas aquellas instancias de Obras que coincidan con los criterios de búsqueda
     * definidos por el usuario en la UI.
     * @param fechaInicio
     * @param fechaFin
     * @param departamento
     * @param empresa
     * @param programa
     * @param monto
     * @param obra
     * @param tipoObra
     * @param subtipoObra
     * @return una lista con todas aquellas obras que coincidan con los criterios de búsqueda definidos por el usuario en la UI,
     * y Null en caso contrario
     * Interfaz remota
     */
    public List<Obra> filtrarObrasPublicasRemote(Date fechaInicio, Date fechaFin, String departamento, String empresa, String programa, Float monto, String obra, String tipoObra, String subtipoObra) {
        try {
            String sql = "SELECT o FROM Obra o WHERE o.nombre LIKE :nombreObra " +
                    "AND o.idTipoObra.nombre LIKE :tipoObra " +
                    "AND o.idSubtipoObra.nombre LIKE :subtipoObra " +
                    "AND o.idEmpresa.razonSocial LIKE :razonSocial " +
                    "AND o.idPrograma.nombre LIKE :programa";

            if (fechaInicio != null) {
                    sql = sql + " AND o.fechaInicioReal >= :fechaInicio";
            }

            if (fechaFin != null) {
                    sql = sql + " AND o.fechaFinReal <= :fechaFin";
            }

            if (departamento != null) {
                //No se busca
            }

            if (monto != null) {
                    sql = sql + " AND o.montoTotal >= :monto";
            }

            sql = sql + " AND o.eliminada = 0 ORDER BY o.nombre";
            javax.persistence.Query q = em.createQuery(sql);
            q.setParameter("nombreObra", "%" + obra + "%");
            q.setParameter("tipoObra", "%" + tipoObra + "%");
            q.setParameter("subtipoObra", "%" + subtipoObra + "%");
            q.setParameter("razonSocial", "%" + empresa + "%");
            q.setParameter("programa", "%" + programa + "%");
            if(fechaInicio!=null){
                q.setParameter("fechaInicio", fechaInicio);
            }
            if(fechaFin!=null){
                q.setParameter("fechaFin", fechaFin);
            }
            if(monto!=null){
                q.setParameter("monto", monto.floatValue());
            }
            return (List<Obra>) q.getResultList();
        } catch (Exception e) {
            GestorConsultaObraBean.log4jArchivo(e);
            return null;
        }
    }

    /**
     * Retorna una lista con todas aquellas instancias de Obra cuyos atributos coincidan con los
     * parametros codigo, nombre, tipoObra y localidad. Para ser utilizado en el dispositivo
     * móvil.
     * @param codigo
     * @param nombre
     * @param tipoObra
     * @param localidad
     * @return listado de instancias de Obras.
     */
    public List<Obra> filtarObrasJ2MERemote (String codigo, String nombre, String tipoObra, String localidad){
        try{  
            javax.persistence.Query q = em.createNamedQuery("Obra.filtarObrasJ2ME");
            q.setParameter("codigo",codigo.toUpperCase().trim());
            q.setParameter("nombre", nombre.toUpperCase().trim());
            q.setParameter("tipoObra", tipoObra.toUpperCase().trim());
            q.setParameter("localidad", localidad.toUpperCase().trim());
            return (List<Obra>) q.getResultList();

        }catch(Exception e){
            GestorConsultaObraBean.log4jArchivo(e);
            return null;
        }
    }

    /**
     * Retorna una lista con todas aquellas instancias de Obra cuyos atributos coincidan con los
     * parametros codigo, nombre, tipoObra y localidad. Para ser utilizado en el dispositivo
     * móvil.
     * @param codigo
     * @param nombre
     * @param tipoObra
     * @param localidad
     * @return listado de Obras.
     */
     public List<Obra> filtarObrasJ2ME (String codigo, String nombre, String tipoObra, String localidad){
        try{
            javax.persistence.Query q = em.createNamedQuery("Obra.filtarObrasJ2ME");
            q.setParameter("codigo",codigo.toUpperCase().trim());
            q.setParameter("nombre", nombre.toUpperCase().trim());
            q.setParameter("tipoObra", tipoObra.toUpperCase().trim());
            q.setParameter("localidad", localidad.toUpperCase().trim());
            return (List<Obra>) q.getResultList();

        }catch(Exception e){
            GestorConsultaObraBean.log4jArchivo(e);
            return null;
        }
    }


    /***
     * Retorna una lista con todas aquellas instancias de Obras relacionadas con una Empresa en particular,
     * cuya razon social coincida con el parametro razonEmpresa.
     * @param razonEmpresa
     * @return una lista con todas aquellas obras relacionadas con una Empresa en particular, y null en caso contrario
     * Interfaz remota
     */
    public List<Obra> filtrarObrasPublicasPorEmpresaRemote(String razonEmpresa) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Obra.filtrarObrasPorEmpresa");
            q.setParameter("razonEmpresa", razonEmpresa);
            return (List<Obra>) q.getResultList();
        } catch (Exception e) {
            GestorConsultaObraBean.log4jArchivo(e);
            return null;
        }
    }

    /***
     * Retorna una lista con todas aquellas instancias de Obras relacionadas con una Empresa en particular,
     * cuya razon social coincida con el parametro razonEmpresa.
     * @param razonEmpresa
     * @return una lista con todas aquellas obras relacionadas con una Empresa en particular, y null en caso contrario
     * Interfaz local
     */

    public List<Obra> filtrarObrasPublicasPorEmpresa(String razonEmpresa) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Obra.filtrarObrasPorEmpresa");
            q.setParameter("razonEmpresa", razonEmpresa);
            return (List<Obra>) q.getResultList();
        } catch (Exception e) {
            GestorConsultaObraBean.log4jArchivo(e);
            return null;
        }
    }

    /***
     * Retorna una lista con todas las instancias de Obra cuyos nombres coincidan
     * con el parametro nombre.
     * @param nombre
     * @return una lista con todas aquellas obras que coincidan con el nombre pasado como parámetro
     * y null en caso contrario
     * Interfaz remota
     */
    public List<Obra> filtrarObrasPublicasPorNombreRemote(String nombre) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Obra.findByNombre");
            q.setParameter("nombre", nombre);
            return q.getResultList();
        } catch (Exception e) {
            GestorConsultaObraBean.log4jArchivo(e);
            return null;
        }

    }

    /***
     * Retorna una lista con todas las instancias de Obra cuyos nombres coincidan
     * con el parametro nombre.
     * @param nombre
     * @return una lista con todas aquellas obras que coincidan con el nombre pasado como parámetro
     * y null en caso contrario
     * Interfaz local
     */
    public List<Obra> filtrarObrasPublicasPorNombre(String nombre) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Obra.findByNombre");
            q.setParameter("nombre", nombre);
            return q.getResultList();
        } catch (Exception e) {
            GestorConsultaObraBean.log4jArchivo(e);
            return null;
        }

    }
   
}
